// stores/modules/chat.js - 聊天模块状态管理
import { defineStore } from 'pinia'
import api from '@/api/modules'

export const useChatStore = defineStore('chat', {
  state: () => ({
    messages: [],
    currentDeviceId: null,
    loading: false
  }),
  
  actions: {
    // 设置当前设备ID
    setCurrentDeviceId(id) {
      this.currentDeviceId = id
      this.messages = []
    },
    
    // 添加消息
    addMessage(message) {
      this.messages.push(message)
    },
    
    // 设置消息列表
    setMessages(messages) {
      this.messages = messages
    },

    // 发送模拟流式消息
    async sendTypingMessage(data) {
      try {
        this.loading = true
        
        // 构建用户消息对象
        const userMessage = {
          id: Date.now(),
          role: 'user',
          content: data.message,
          timestamp: Date.now()
        }
        
        // 添加到消息列表
        this.addMessage(userMessage)
        
        // 构建请求数据
        const requestData = {
          content: data.message,
          deviceId: parseInt(data.sessionId),
          stream: false
        }
        
        // 创建 AI 响应消息对象
        const assistantMessage = {
          id: Date.now() + 1,
          role: 'assistant',
          content: '',
          timestamp: Date.now()
        }
        this.addMessage(assistantMessage)
        
        try {
          // 发送普通请求
          const res = await api.chat.sendMessage(requestData)
          
          if (res.data && res.data.content) {
            // 获取完整响应内容
            const fullContent = res.data.content
            
            // 模拟流式输出
            let currentIndex = 0
            const totalLength = fullContent.length
            
            // 定义打字效果函数
            const typeEffect = () => {
              if (currentIndex < totalLength) {
                // 每次添加1-3个字符，模拟不同打字速度
                const chunkSize = Math.floor(Math.random() * 3) + 1
                const nextIndex = Math.min(currentIndex + chunkSize, totalLength)
                
                // 添加新内容
                const newChunk = fullContent.substring(currentIndex, nextIndex)
                assistantMessage.content += newChunk
                
                // 更新索引
                currentIndex = nextIndex
                
                // 强制更新消息列表
                this.messages = [...this.messages]
                
                // 继续打字效果，速度随机在50-150ms之间
                const delay = Math.floor(Math.random() * 100) + 50
                setTimeout(typeEffect, delay)
              }
            }
            
            // 开始打字效果
            typeEffect()
          }
          
          return assistantMessage
        } catch (error) {
          console.error('请求失败:', error)
          throw error
        }
      } catch (error) {
        console.error('消息发送失败:', error)
        throw error
      } finally {
        this.loading = false
      }
    },

    // 获取消息列表
    async getMessages(deviceId, page = 1, size = 20) {
      try {
        // 确保deviceId有效
        if (!deviceId || isNaN(deviceId)) {
          console.error('无效的设备ID:', deviceId);
          throw new Error('无效的设备ID');
        }
        
        // 如果是新的设备ID，先清空消息列表
        if (deviceId !== this.currentDeviceId) {
          this.setCurrentDeviceId(deviceId);
        }
        
        const res = await api.chat.getHistory(deviceId, {
          page,
          size
        });
        
        if (res.code === 200) {
          const messages = res.data?.records || res.data || [];
          
          // 确保检查消息数组是否为空
          if (messages && messages.length > 0) {
            console.log('收到历史消息，数量:', messages.length);
            
            // 如果是第一页，则替换消息列表，否则将消息添加到列表开头
            if (page === 1) {
              this.setMessages(messages);
            } else {
              this.messages = [...messages, ...this.messages];
            }
          } else {
            console.log('未找到历史消息');
            // 如果是第一次加载，设置为空数组
            if (page === 1) {
              this.setMessages([]);
            }
          }
          
          return messages;
        } else {
          console.error('获取消息失败:', res.message);
          throw new Error(res.message || '获取消息失败');
        }
      } catch (error) {
        console.error('获取消息失败:', error);
        // 如果是第一页的错误，设置空数组但不中断流程
        if (page === 1) {
          this.setMessages([]);
        }
        throw error;
      }
    },
    
    // 清空聊天记录
    async clearHistory(deviceId) {
      try {
        const res = await api.chat.clearHistory(deviceId)
        if (deviceId === this.currentDeviceId) {
          this.messages = []
        }
        return res
      } catch (error) {
        throw error
      }
    }
  }
})